#coding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

import requests

import confs
import dbs

class Message(object):
    '''
    通知大家上课, noitry(number, content)
        number : 上课的班级数
        content : 通知上课的内容
    单个短信发送：send(phone, content)
        phone : 手机号
        content : 发送短信内容
    验证码：code(phone, v_code, ttl=120)
        phone : 发送验证码的手机号
        v_code : 验证码
        ttl : redis临时存储key的超时时间
    '''
    def __init__(self):
        self.err_code = {
            -1 : "参数不全",
            -2 : "服务器空间不支持,请确认支持curl或者fsocket，联系您的空间商解决或者更换空间！",
            30 : "密码错误",
            40 : "账号不存在",
            41 : "余额不足",
            42 : "帐户已过期",
            43 : "IP地址限制",
            50 : "内容含有敏感词",
            51 : "手机号码不正确",
        }
        self.url = confs.smsbao_api_key.get('url','http://api.smsbao.com/sms')
        self.user = confs.smsbao_api_key.get('user', None)
        self.passwd = confs.smsbao_api_key.get('passwd', None)

    #通知大家上课
    def noity(self, cls_type='python', num='4', cls_content='python讲解', time='晚8:00'):
        '''
        params:
            cls_type : 班级类型, python linux 
            num : class one, clas two value(int): 1,2,3
                  num is None ,get all user
            cls_content : 上课类容
            time : 上课时间
        '''
        ret_list = self.get_phones(cls_type=cls_type,num=num)
        if ret_list.get('code',1) != 0: #获取手机号列表错误
            return ret_list
        else:
            phones = ret_list.get('data',[])
        result = {}
        for phone,username in phones: #迭代发送短信并把结果存储在result里
            content = '【京峰课堂】尊敬的{username}:我们将于{time}进行{cls_type}上课，上课内容为[{cls_content}],请准时上课。'.format(username=username,
                        time=time,
                        cls_type=cls_type,
                        cls_content=cls_content)
            data = self.send(phone,content)
            data['username'] = username; data['phone'] = phone
            result[phone] = data
        return result

    #能够单独给某个用户发送消息
    def send(self, phone, content):
        '''
        params:
            phone : request phone number
            content : request message content
        '''
        try:
            payload = {
                'u' : self.user,
                'p' : self.passwd,
                'm' : phone,
                'c' : content
            }
            r = requests.get(self.url, params=payload) #请求url
            res = r.text
            if res.strip().isdigit(): #去左右空白，是否为数字isdigit不能判断负数
                code = int(res)
                if code == 0: 
                    return { 'code' : 0, 'message' : '短信发送成功'}
                elif code in self.err_code: #已知错误
                    return { 'code' : code, 'message' : self.err_code.get(code)}
                else:
                    return { 
                            'code' : 402,
                            'message' : '短信平台给定一个未知代码，请更新代码库'
                           }
            else: #未知错误
                return { 
                            'code' : 401, 
                            'message' : '接收平台返回信息错误，请管理员查看'
                       }
        except Exception as e:
            return { 'code' : 400, 'message' : str(e)}

    #发送用户的验证码
    def code(self, phone, v_code, ttl=120):
        ret = self.send(phone=phone, content=v_code)
        if ret.get('code', 1) != 0:
            return ret
        #触发往redis里写数据
        try:
            redis_client = dbs.redis_connect()
            redis_client.set(phone, v_code) #添加key到redis
            redis_client.expire(phone, ttl) #设置值的ttl时间
            return { 'code' : 0, 'message' : '设置key成功'}
        except Exception as e:
            return { 'code' : 405, 'message' : '设置redis的key发生错误\t'+str(e)}

    def get_phones(self, cls_type='phone', num=None):
        conn, cur = dbs.db_connect()
        if num: #是否查几期班
            query = '''
                    SELECT 
                        phone,username
                    FROM 
                        users 
                    WHERE 
                        status = 1 and 
                        num={num} and
                        cls_type="{cls_type}"'''.format(cls_type=cls_type,num=num)
        else:
            query = '''
                    SELECT 
                        phone,username
                    FROM users 
                    WHERE 
                        status = 1'''
        try:
            cur.execute(query)
            result = cur.fetchall()
            if result: #结果是否有列表
                data = [ (phone[0],phone[1]) for phone in result ] #phone username
                return { 'code' : 0 , 'message' : '获取成功', 'data' : data}
            else:
                return { 'code' : 403, 'message': '未查询到手机号'}
        except Exception as e:
            return { 'code': 404, 'message' : str(e)}
        finally:
            cur.close();conn.close()

if __name__ == '__main__':
    m = Message()
    print m.noity(cls_content='短信平台完善')

